/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifndef _HAL_MISC_H
#define _HAL_MISC_H

#ifdef __cplusplus
extern "C" {
#endif

#include "hal_struct.h"

typedef struct {
    int32_t db;
    int32_t connected;
    char ccid[64];
    char operators[16];
} HAL_4G_STATUS_S;

typedef struct {
    /* 网络制式切换模式,
     * 0: 自动切换, (默认)
     * 1: 无效
     * 2: 强制2G
     * 3: 强制3G
     * 4: 强制4G
     */
    uint32_t uSwitchMethold;

    /* 拨号验证协议,
     * 0: 自动选择验证方式, 由ppp协议协商确定, 即是我们常见的自动, (默认)
     * 1: CHAP, 挑战认证验证方式, 验证报文经MD5加密, 相对较安全
     * 2: PAP, 普通的明文用户名,密码验证,不是很安全
     */
    uint32_t uVerifyProtocal;

    /* APN, 为空时diald会根据当前运营商信息选择一个默认APN, 下面是国内3大运营商的默认APN
     * 中国移动: CMNET
     * 中国联通: 3gnet
     * 中国电信: ctlte, 注: 电信3G或者2G不使用APN
     * 对于非国内三大运营商的网络, APN默认填3gnet, 所以国外项目最好填写该参数
     * 注: 设置成null或none时, 表示给模块一个空的APN, (即: AT+CGDCONT=1,"ip","")
     */
    char szAPN[128];

    /* 拨号号码, 默认为空, 为空时diald会根据当前运营商信息选择一个默认的拨号号码, 下面是国内3大运营商的默认拨号号码
     * 中国移动: *98#
     * 中国联通: *99#
     * 中国电信: #777
     * 对于非国内三大运营商的网络, APN默认填*99#, 所以国外项目最好填写该参数
     * 注: 设置成null或none时, 表示给模块一个空的拨号号码
     */
    char szTelephone[128];

    /* 用户名, 默认为空, 为空时diald会根据当前运营商信息选择一个默认的用户名, 下面是国内3大运营商的默认用户名
     * 中国移动: user
     * 中国联通: (空)
     * 中国电信: card
     * 对于非国内三大运营商的网络, 用户名默认置空, 所以国外项目最好填写该参数
     * 注: 设置成null或none时, 表示给模块一个空的用户名
     */
    char szUserName[128];

    /* 密码, 默认为空, 为空时diald会根据当前运营商信息选择一个默认的密码, 下面是国内3大运营商的默认密码
     * 中国移动: user
     * 中国联通: (空)
     * 中国电信: card
     * 对于非国内三大运营商的网络, 密码默认置空, 所以国外项目最好填写该参数
     * 注: 设置成null或none时, 表示给模块一个空的密码
     */
    char szPassword[128];

    /* 拨号MTU, 合法范围 128 ~ 16384 */
    uint32_t uDialMtu;
} HAL_4G_DIAL_PARAM_S;

/**
 * @breif 初始化复位按键、红蓝绿指示灯
 *
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_ResetLedInit(void);

/**
 * @breif 控制红蓝绿三色Led状态，板子如没有红绿蓝灯，不要调用该API。
 *
 * @param [in] red 红色Led 1:点亮；0:熄灭
 * @param [in] green 绿色Led 1:点亮；0:熄灭
 * @param [in] blue 蓝色Led 1:点亮；0:熄灭
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_setLedState(int32_t red, int32_t green, int32_t blue);

/**
 * @breif 获取Reset键状态。
 *
 * @param [out] pValue 获取reset按键状态 1 : reset按键没按		0 : reset按下。
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_readResetKey(uint32_t *pValue);

/**
 * @breif 系统运行指示灯操作
 *
 * @param bOpen [in]		是否打开系统运行指示灯，1:点亮；0:关闭
 *
 * @note 如果板子没有系统运行指示灯，不要调用该API
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_openSystemLed(int32_t channel, int32_t bOpen);

/**
 * @breif 连接4G
 *
 * @param bOpen [in]		是否打开系统运行指示灯，1:点亮；0:关闭
 *
 * @note 4G断开连接，或者连接失败，函数返回
 * @note 连接成功时，该函数会阻塞。所以必须开一个进程（线程）去连接
 *		若连接成功，则函数不返回！若需要断开连接，则需要杀死进程（线程）！
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_Connect4G(void);

/**
 * @breif 手动连接4G
 *
 * @param bOpen [in]		是否打开系统运行指示灯，1:点亮；0:关闭
 *
 * @note 4G断开连接，或者连接失败，函数返回
 * @note 连接成功时，该函数会阻塞。所以必须开一个进程（线程）去连接
 *		若连接成功，则函数不返回！若需要断开连接，则需要杀死进程（线程）！
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */
int32_t Hal_Misc_Connect4G_man(HAL_4G_DIAL_PARAM_S *Param);

/**
 * @breif 查询4G连接状态
 *
 * @param status [out] 4G状态信息
 *
 *
 * @return 返回 HAL_SUCCESS 成功，其他值 失败
 */

int32_t Hal_Misc_4G_CheckStatus(HAL_4G_STATUS_S *status);

#ifdef __cplusplus
}
#endif

#endif // _HAL_MISC_H
